home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / et / src / pna.c < prev    next >
Text File  |  1993-07-08  |  16KB  |  541 lines

  1. #include  "et.h"
  2. void  copy_pna(int menu_i)/*et*/
  3. {
  4.   static DIR Dir[1];
  5.   static int dv_n, dv_i, pna_i, pna_n;
  6.   char  file_a[100], s_a[100];
  7.   char  *c_p, *s_p;
  8.   int   i, key, dv_b;
  9.   static TT Tt;
  10.   
  11.   G_pn.wink = P_i[i_WIN_PNA];
  12.   set_bit(G_f, f_TT);
  13.   disp_menu(menu_i, P_v[v_VIEW_0], 1, 0);
  14.   copy_buffer(2, STORE, NULL, 0);
  15.   if (!test_bit(G_f2, f2_PNA)) {
  16.     set_bit(G_f2, f2_PNA);
  17.     Tt.p = G_mn[mn_DISK].p+72;
  18.     Tt.q = G_mn[mn_DISK].q;
  19.     dv_n = dv_i = G_nb.pna_drive;
  20.     while (!_get_current_directory(s_a, dv_n))
  21.       dv_n++;
  22.     dv_n--;
  23.   } else {
  24.     _select_disk(2);
  25.     _select_disk(dv_i);
  26.   }
  27.   strcpy(Tt.s, P_c[c_PNA_BAR]);
  28.   Tt.col = H_RED;
  29.   disp_drive(dv_i, -1, Tt);
  30.   dv_b = dv_i;
  31.   pna_i = P_i[i_PNA_I][dv_i];
  32.   pna_n = P_i[i_PNA_N][dv_i];
  33.   if (pna_n > 0)
  34.     find_pna(dv_i, pna_i, Dir);
  35.   key = 0;
  36.   do {
  37.     if (dv_i != dv_b) {
  38.       P_i[i_PNA_I][dv_b] = pna_i;
  39.       P_i[i_PNA_N][dv_b] = pna_n;
  40.       disp_drive(dv_b, dv_i, Tt);
  41.       dv_b = dv_i;
  42.       pna_i = P_i[i_PNA_I][dv_i];
  43.       pna_n = P_i[i_PNA_N][dv_i];
  44.       if (pna_n > 0)
  45.         find_pna(dv_i, pna_i, Dir);
  46.     }
  47.     if (P_i[i_PNA_N][dv_i] < 0) {
  48.       move_pna(dv_i);
  49.       _select_disk(2);
  50.       _select_disk(dv_i);
  51.       pna_n = make_pna_list(dv_i);
  52.       goto_current();
  53.       pna_i = 0;
  54.       P_i[i_PNA_I][dv_i] = pna_i;
  55.       P_i[i_PNA_N][dv_i] = pna_n;
  56.       if (pna_n > 0)
  57.         find_pna(dv_i, pna_i, Dir);
  58.     }
  59.     if (!pna_n)
  60.       s_p = P_c[c_PNA_BAR];
  61.     else {
  62.       strcpyfar(file_a, Dir->s);
  63.       strcpy(s_a, file_a);
  64.       s_p = shift_pna(s_a);
  65.       s_p[instring('.', s_p, sizeof(char))-1] = '\0';
  66.     }
  67.     draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
  68.     for (i = 2; i; i--, exchange_page()) {
  69.       if (i == 1) {
  70.         copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, POKE);
  71.         continue;
  72.       }
  73.       draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
  74.       draw_ank(L_WHT, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
  75.       draw_ank(L_WHT, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
  76.       draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
  77.       copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, PEEK);
  78.     }
  79.     draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
  80.     strcpy(Tt.s, s_p);
  81.     do {
  82.       while ((key = inkey(WINK)) == 0)
  83.         ;
  84.       if (key == _ESC)
  85.         continue;
  86.       switch(key) {
  87.       case _UP:
  88.         if (!pna_n)
  89.           continue;
  90.         if (!pna_i)
  91.           continue;
  92.         pna_i--;
  93.         peek_dir(Dir, Dir->pre);
  94.         break;
  95.       case _DN:
  96.         if (!pna_n)
  97.           continue;
  98.         if (pna_i == pna_n-1)
  99.           continue;
  100.         pna_i++;
  101.         peek_dir(Dir, Dir->next);
  102.         break;
  103.       case _LT:
  104.         if (!dv_i)
  105.           continue;
  106.         dv_i--;
  107.         _select_disk(2);
  108.         _select_disk(dv_i);
  109.         key = BREAK;
  110.         continue;
  111.         break;
  112.       case _RT:
  113.         if (dv_i == dv_n-1)
  114.           continue;
  115.         dv_i++;
  116.         _select_disk(2);
  117.         _select_disk(dv_i);
  118.         key = BREAK;
  119.         continue;
  120.         break;
  121.       case _HOME:
  122.         P_i[i_PNA_N][dv_i] = -1;
  123.         key = BREAK;
  124.         continue;
  125.         break;
  126.       case _RET:
  127.       case S_RET:
  128.         if (!pna_n) {
  129.           key = 0;
  130.           continue;
  131.         }
  132.         key = pna_enter(key, file_a, &Tt);
  133.         G_pn.wink = P_i[i_WIN_PNA]; 
  134.         continue;
  135.       default:
  136.         continue;
  137.       }
  138.       strcpyfar(file_a, Dir->s);
  139.       strcpy(s_a, file_a);
  140.       s_p = shift_pna(s_a);
  141.       s_p[instring('.', s_p, sizeof(char))-1] = '\0';
  142.       draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);
  143.       for (i = 2; i; i--, exchange_page()) {
  144.         if (i == 1) {
  145.           copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, POKE);
  146.           continue;
  147.         }
  148.         draw_ank(H_RED, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);  
  149.         draw_ank(L_WHT, 11-strlen(Tt.s), Tt.p, Tt.q, Tt.s, 0);  
  150.         draw_ank(L_WHT, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);  
  151.         draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);  
  152.         copy_window(P_i[i_WIN_PNA], P_v[v_KEY_TMP], 0x14, PEEK);
  153.       }
  154.       draw_ank(H_RED, 11-strlen(s_p), Tt.p, Tt.q, s_p, 0);
  155.       strcpy(Tt.s, s_p);
  156.     } while (key != _ESC && key != _RET && key != BREAK);
  157.   } while (key != _ESC && key != _RET);
  158.   P_i[i_PNA_I][dv_i] = pna_i;
  159.   P_i[i_PNA_N][dv_i] = pna_n;
  160.   goto_current();
  161.   res_bit(G_f, f_TT);
  162.   if (key == _ESC)
  163.     disp_menu(menu_i, P_v[v_VIEW_0], 2, 0);
  164.   else
  165.     disp_menu(menu_i, NULL, 6, 0);
  166.   G_nb.pna_drive = dv_i;
  167. }
  168. int   make_pna_list(int dv_i)/*et*/
  169. {
  170.   char  dir_a[100], pna_a[100], current_a[100];
  171.   int   exist, fd, pna_i;
  172.   DIR   *Far;
  173.   DIR   Dir[1];
  174.  
  175.   _get_current_directory(current_a, 0);
  176.   pna_i = 0;
  177.   make_dir_list(dv_i);
  178.   peek_dir(Dir, G_bf.dir);
  179.   while (!_change_current_directory(".."))
  180.     ;
  181.   while (1) {
  182.     _far_copy_buf(0x120, Dir->s, 0x14, pna_a, Dir->len);
  183.     strcpy(dir_a, pna_a);
  184.     dir_a[Dir->len-2] = '\0';
  185.     if (instring('\\', dir_a, 1))
  186.       _change_current_directory(dir_a);
  187.     exist = !_find_first_file(P_c[c_PNA_NAME], 0);
  188.     if (exist) {
  189.       set_pna_name(dv_i, pna_a);
  190.       pna_i++;
  191.     }
  192.     while (exist) {
  193.       exist = !_find_next_file();
  194.       if (!exist)
  195.         continue;
  196.       set_pna_name(dv_i, pna_a);
  197.       pna_i++;
  198.     }
  199.     if (!Dir->next)
  200.       break;
  201.     peek_dir(Dir, Dir->next);
  202.   }
  203.   while (_change_current_directory("..") != 0x03)
  204.     ;
  205.   _change_current_directory(current_a);
  206.   return(pna_i);
  207. }
  208. void  make_dir_list(int dv_i)/*et*/
  209. {
  210.   char  dir_a[100], current_a[100];
  211.   int   i, len, fd, exist;
  212.   DTA   *Dta;
  213.   
  214.   _get_current_directory(current_a, 0);
  215.   while (!_change_current_directory(".."))
  216.     ;
  217.   dir_a[0] = dv_i+_AA;
  218.   dir_a[1] = ':';
  219.   dir_a[2] = '\\';
  220.   dir_a[3] = '\0';
  221.   G_pn.dir = (char*)G_bf.dir; /* ←作業領域開始番地 (0x12000 bytes free) */
  222.   save_list(NULL, dir_a, &fd, &G_pn.dir);
  223.   exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
  224.   while (1) {
  225.     while (1) {
  226.       Dta = _get_disk_transfer_address();
  227.       _far_copy_buf(Dta->seg, Dta->addr, 0x14, P_c[c_DTA_TAB], 0x40);
  228.       if (strcmp(".", &P_c[c_DTA_TAB][0x1e]))
  229.         if (strcmp("..", &P_c[c_DTA_TAB][0x1e]))
  230.           break;
  231.       exist = !_find_next_file();
  232.       if (!exist)
  233.         break;
  234.     }
  235.     if (exist) {
  236.       _copy_buf(&P_c[c_DTA_TAB][2], &P_c[c_DTA_TAB][0x1e], 13);
  237.       *P_c[c_DTA_TAB] = '.';
  238.       P_c[c_DTA_TAB][1] = '\\';
  239.       len = strlen(dir_a);
  240.       if (!_change_current_directory(&P_c[c_DTA_TAB][2])) {
  241.         _change_current_directory("..");
  242.         strcat(dir_a, &P_c[c_DTA_TAB][2]);
  243.         strcat(dir_a, "\\");
  244.         save_list(G_bf.dir, dir_a, &fd, &G_pn.dir);
  245.         if (fd)
  246.           dir_a[len] = '\0';
  247.         else {
  248.           _change_current_directory(&P_c[c_DTA_TAB][2]);
  249.           exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
  250.           continue;
  251.         }
  252.       }
  253.     } else {
  254.       if (_change_current_directory(".."))
  255.         break;
  256.       dir_a[2] = '\\';
  257.       _get_current_directory(&dir_a[3], dv_i+1);
  258.       if (strlen(dir_a) > 3)
  259.         strcat(dir_a, "\\");
  260.       exist = !_find_first_file(P_c[c_DIR_NAME], 0x10);
  261.       continue;
  262.     }
  263.     exist = !_find_next_file();
  264.   }
  265.   while (_change_current_directory("..") != 0x03)
  266.     ;
  267.   _change_current_directory(current_a);
  268. }
  269. int   pna_enter(int key, char file_a[], TT *Tt)/*et*/
  270. {
  271.   FILE  *File;
  272.   int   file_n, k, max_i, edge_i, cut;
  273.   int   cut_b, edge_b, mm;
  274.   
  275.   file_n = G_nb.csr;
  276.   set_bit(G_f, f_AA);
  277.   res_bit(G_f, f_NN);
  278.   if (key == S_RET) {
  279.     Tt->col = H_BLU;
  280.     mm = 0;
  281.   } else {
  282.     Tt->col = H_RED;
  283.     mm = 1;
  284.   }
  285.   draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  286.   for (k = 2; k; k--, exchange_page()) {
  287.     if (k == 1) {
  288.       copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, POKE);
  289.       continue;
  290.     }
  291.     cls_view(P_i[i_WIN_VIEW]);
  292.     if (!mm) {
  293.       draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  294.       draw_ank(H_BLU, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  295.     }
  296.     copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, PEEK);
  297.   }
  298.   G_ps.x = 0;
  299.   G_ps.y = 0;
  300.   G_ps.z = (int)(G_pm.i.dist - G_pm.i.pers) * GETA_ET;
  301.   set_bit(G_f, f_BAR);
  302.   key = make_pna(file_a);
  303.   res_bit(G_f, f_BAR);
  304.   G_nb.cut = 0;
  305.   if (key != _ESC) {
  306.     P_c[c_CSR][0] = file_n+1;
  307.     G_mv[0].key = _BK;
  308.     G_mv[1].key = EOK;
  309.     init_st();
  310.     set_file_i(&P_c[c_FILE_BAK][8], 3);
  311.     File = et_fopen(P_c[c_FILE_BAK], "rb", NULL);
  312.     fread(&G_nb.edge, sizeof(int), 1, File);
  313.     max_i = G_nb.edge-G_nb.max_edge;
  314.     if (G_nb.edge > G_nb.max_edge) {
  315.       fread(G_et, sizeof(ET), G_nb.max_edge, File);
  316.       fread(G_bf.et_buf, sizeof(ET), max_i, File);
  317.       G_nb.edge = G_nb.max_edge;
  318.     } else
  319.       fread(G_et, sizeof(ET), G_nb.edge, File);
  320.     fclose(File);
  321.     set_bit(G_f, f_EE);
  322.     for (k = 2; k; k--, exchange_page()) {
  323.       if (k == 1) {
  324.         copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
  325.         continue;
  326.       }
  327.       draw_mode(5, mn_EE, L_WHT);
  328.       draw_mode(5, mn_EE, H_RED);
  329.       set_trace_mode(test_bit(G_f, f_AA|f_NN));
  330.       copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
  331.     }
  332.     edge_i = 0;
  333.     if (test_bit(G_f, f_REPLAY)) {
  334.       cut_b = read_replay(0);
  335.       edge_b = read_replay(0);
  336.     }
  337.     set_bit(G_f, f_BAR);
  338.     make_et(&edge_i, &cut, cut_b, edge_b, mm);
  339.     res_bit(G_f, f_BAR);
  340.     G_nb.cut = 0;
  341.     if (!test_bit(G_f, f_DEMO|f_MAKE|f_REPLAY)) {
  342.       if (cut) {
  343.         write_replay(cut);
  344.         write_replay(edge_i);
  345.       } else {
  346.         write_replay(0);
  347.         write_replay(-1);
  348.       }
  349.     }
  350.     draw_cut(cut);
  351.     if (cut != _ESC) {
  352.       for (k = 2; k; k--, exchange_page()) {
  353.         if (k == 1) {
  354.           copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
  355.           continue;
  356.         }
  357.         draw_mode(2, mn_UP, L_WHT);
  358.         draw_mode(2, mn_DN, L_WHT);
  359.         draw_mode(2, mn_LT, L_WHT);
  360.         draw_mode(2, mn_RT, L_WHT);
  361.         copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
  362.       }
  363.       G_nb.mn = mn_EE;
  364.       key = sub_enter2(edge_i, file_n, mm);
  365.       G_nb.mn = mn_TT;
  366.     } else
  367.       key = cut;
  368.     res_bit(G_f, f_EE);
  369.     access_page();
  370.     copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_1], 0x120, PEEK);
  371.     access_page();
  372.     copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_1], 0x120, POKE);
  373.     for (k = 2; k; k--, exchange_page()) {
  374.       if (k == 1) {
  375.         copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, POKE);
  376.         continue;
  377.       }
  378.       draw_mode(5, mn_EE, H_RED);
  379.       draw_mode(5, mn_EE, L_WHT);
  380.       draw_mode(3, mn_UP, L_WHT);
  381.       draw_mode(3, mn_DN, L_WHT);
  382.       draw_mode(3, mn_LT, L_WHT);
  383.       draw_mode(3, mn_RT, L_WHT);
  384.       copy_window(P_i[i_WIN_MENU], P_v[v_VRAM], 0x14, PEEK);
  385.     }
  386.     if (key != _ESC) {
  387.       goto_current();
  388.       key = _RET;
  389.     }
  390.   } 
  391.   if (key == _ESC) {
  392.     copy_buffer(2, RESTORE, NULL, 0);
  393.     for (k = 2; k; k--, exchange_page()) {
  394.       if (k == 1) {
  395.         copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, POKE);
  396.         continue;
  397.       }
  398.       cls_view(P_i[i_WIN_VIEW]);
  399.       copy_window(P_i[i_WIN_VIEW], P_v[v_VIEW_0], 0x120, POKE);
  400.       draw_ank(Tt->col, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  401.       draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  402.       draw_edge(P_SET, AFT);
  403.       set_trace_mode(test_bit(G_f, f_AA|f_NN));
  404.       copy_window(P_i[i_WIN_VRAM], P_v[v_VRAM], 0x14, PEEK);
  405.     }
  406.     draw_ank(H_RED, 11-strlen(Tt->s), Tt->p, Tt->q, Tt->s, 0);
  407.     key = 0;
  408.   }
  409.   return(key);
  410. }
  411. void  disp_drive(int old_i, int new_i, TT Tt)/*et*/
  412. {
  413.   int   i;
  414.   
  415.   P_c[c_PNA_OLD][1] = old_i + 0x60;
  416.   if (new_i >= 0)
  417.     P_c[c_PNA_NEW][1] = new_i + 0x60;
  418.   for (i = 2; i; i--, exchange_page()) {
  419.     draw_kanji(H_RED, 0, Tt.p-64, Tt.q, P_c[c_PNA_OLD]);
  420.     if (new_i >= 0)
  421.       draw_kanji(H_RED, 0, Tt.p-64, Tt.q, P_c[c_PNA_NEW]);
  422.   }
  423. }
  424. void  set_pna_name(int dv_i, char *pna_p)/*et*/
  425. {
  426.   DIR   *Far;
  427.   DTA   *Dta;
  428.   int   fd, len;
  429.   char  pna_a[100];
  430.   
  431.   Far = G_bf.pna;     /* ←PNA リスト開始番地 (0xA000 bytes free) */
  432.   strcpy(pna_a, pna_p);
  433.   len = strlen(pna_a);
  434.   Dta = _get_disk_transfer_address();
  435.   _far_copy_buf(Dta->seg, Dta->addr, 0x14, P_c[c_DTA_TAB], 0x40);
  436.   _copy_buf(P_c[c_DTA_TAB], &P_c[c_DTA_TAB][0x1e], 13);
  437.   P_c[c_DTA_TAB][instring('.', P_c[c_DTA_TAB], sizeof(char))+3] = '\0';
  438.   strcpy(&pna_a[len], P_c[c_DTA_TAB]);
  439.   if (G_pn.pna != (char*)G_bf.pna)
  440.     save_list(Far, pna_a, &fd, &G_pn.pna);
  441.   else
  442.     save_list(NULL, pna_a, &fd, &G_pn.pna);
  443. }
  444. int   find_pna(int dv_i, int pna_i, DIR Dir[])/*et*/
  445. {
  446.   int   fd;
  447.   
  448.   peek_dir(Dir, G_bf.pna);
  449.   fd = 0;
  450.   while (Dir->dir) {
  451.     fd = _peek_byte(0x120, Dir->s) == (dv_i + _AA);
  452.     if (fd || !Dir->next)
  453.       break;
  454.     peek_dir(Dir, Dir->next);
  455.   }
  456.   for (; pna_i; pna_i--)
  457.     peek_dir(Dir, Dir->next);
  458.   return(fd);
  459. }
  460. DIR   *save_list(DIR *Far, char *file_p, int *find_p, char **bf_pp)/*et*/
  461. {
  462.   char  file_a[100];
  463.   FILE  *File;
  464.   DIR   *Tmp, Dir[1];
  465.   
  466.   *find_p = 0;
  467.   if (!Far) {
  468.     Far = (DIR*)*bf_pp;
  469.     Dir->len = strlen(file_p)+1;
  470.     Dir->pre = Far;                           /* ← リスト先頭の pre       */
  471.     Dir->dir = Far;                           /* move_pna() で使用         */
  472.     Dir->next = NULL;
  473.     Dir->s = (char*)((int)Far + sizeof(DIR));
  474.     poke_dir(Dir, Far);
  475.     _far_copy_buf(0x14, file_p, 0x120, Dir->s, Dir->len);
  476.     *bf_pp = (char*)((int)*bf_pp + sizeof(DIR) + Dir->len);
  477.   } else {
  478.     peek_dir(Dir, Far);
  479.     _far_copy_buf(0x120, Dir->s, 0x14, file_a, Dir->len);
  480.     if (strcmp(file_a, file_p)) {
  481.       Dir->next = save_list(Dir->next, file_p, find_p, bf_pp);
  482.       poke_dir(Dir, Far);                     /* Dir->next 保存            */
  483.       Tmp = Dir->next;                        /* ←次行で Dir->next が変更 */
  484.       peek_dir(Dir, Dir->next);
  485.       Dir->pre = Far;                         /* ← リスト先頭以外の pre   */
  486.       poke_dir(Dir, Tmp);                     /* Dir->next->pre 保存       */
  487.     } else
  488.       *find_p = 1;
  489.   }
  490.   return(Far);
  491. }
  492. void  move_pna(int dv_i)/*et*/
  493. {
  494.   int   fd;
  495.   DIR New[1], Old[1];
  496.   unsigned pna_d;
  497.   
  498.   fd = find_pna(dv_i, 0, Old); /* dv_iドライブのファイルリストの先頭を探す */
  499.   if (!fd)                                           /* ← dv_i 領域がない */
  500.     return;
  501.   _copy_buf(New, Old, sizeof(DIR));
  502.   if (New->next)
  503.     while (1) {
  504.       fd = _peek_byte(0x120, New->s) != dv_i + _AA; 
  505.       if (fd || !New->next)       /* dv_i でない先頭があるか, または終わり */
  506.         break;
  507.       peek_dir(New, New->next);
  508.     }
  509.   if (!fd && !New->next) {                        /* dv_i でない領域がない */
  510.     if (New->dir == G_bf.pna) {
  511.       G_pn.pna = (char*)G_bf.pna;
  512.       New->dir = NULL;
  513.       poke_dir(New, (DIR*)G_pn.pna);
  514.     } else {
  515.       peek_dir(New, Old->pre);
  516.       New->next = NULL;
  517.       poke_dir(New, Old->pre);                            /* New->next 保存 */
  518.       G_pn.pna = (char*)Old->dir;
  519.     }
  520.   } else {                                         /* dv_i でない領域がある */
  521.     pna_d = (int)New->dir - (int)Old->dir;               /* dv_i 領域幅算出 */
  522.     while (1) {
  523.       Old->dir = New->dir;
  524.       Old->next = New->next;
  525.       New->pre = (DIR*)((int)New->pre-pna_d);               /* 各ポインタを */
  526.       New->dir = (DIR*)((int)New->dir-pna_d);               /* 領域幅分減少 */
  527.       if (New->next)                                  /* NULL (最後) はパス */
  528.         New->next = (DIR*)((int)New->next-pna_d);
  529.       New->s = (char*)((int)New->s-pna_d);
  530.       poke_dir(New, Old->dir);                              /* ポインタ保存 */
  531.       _far_copy_buf(0x120, Old->dir,                  /* dv_i でない DIR を */
  532.         0x120, (void*)((int)Old->dir - pna_d),        /* dv_i だった DIR へ */
  533.         sizeof(DIR)+New->len);
  534.       if (!Old->next)
  535.         break;
  536.       peek_dir(New, Old->next);                              /* 次の DIR へ */
  537.     }
  538.     G_pn.pna -= pna_d;
  539.   }
  540. }
  541.